import logging
import time
from flask import Blueprint, request, session, jsonify
import pandas as pd
import json
import numpy as np
import os

# 注册蓝图

al = Blueprint('al', __name__, template_folder='../templates_operate', static_url_path="")



@al.route('/col_change/<int:index>', methods=['post'])
def col_change(index):
    """
    更改字段名
    :param index: 文件下标
    :return:状态
    """
    try:
        # 解析表单数据
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = int(data['column_list'][0][1:])

        # 获取新列名
        col_new_name = data['col_new_name']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 获取第一行

        with open(file=file_name, mode='r', encoding='utf-8') as file:
            head = file.readline()
            now_tell = file.tell()

        head = head[:-1].split(',')

        head[cols] = col_new_name

        temp = ','.join(head)+'\n'

        # 表名 生成8个随机的小写英文字母作为
        t = str(int(time.time()))[:7]
        name = ''.join([chr(i) for i in np.random.randint(97, 123, 8)])
        temp_file = 'temp_files/{}.csv'.format(name + t)

        os.rename(file_name, temp_file)

        old_file = open(file=temp_file, mode='rb')

        old_file.seek(now_tell)

        old_data = old_file.read()

        old_file.close()
        with open(file=file_name, mode='wb+') as file:
            file.write(temp.encode())
            file.write(old_data)
        os.remove(temp_file)
    # 捕获异常
    except Exception as e:

        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/col_del/<int:index>', methods=['post'])
def col_del(index):
    """
    删除字段
    :param index: 文件下标
    :return:
    """
    try:
        # 解析表单数据
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 保存临时文件
        temp_file = open(session.get('temp_file'), mode='wb+')
        with open(file_name, mode='rb') as file:
            temp_file.write(file.read())

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 字段下标
        c_index = list(map(lambda x: x[1:], list(cols)))

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:
            head = file.readline()[:-1].split(',')

        # 用pandas打开文件
        temp_data = pd.read_csv(file_name, delimiter=',', iterator=True)
        loop = True
        chunks = []
        while loop:
            try:
                chunk = temp_data.get_chunk(100000)
                chunks.append(chunk)
            except StopIteration:
                loop = False

        df = pd.concat(chunks, ignore_index=True)

        col_names = []
        # 遍历字段下标
        for i in c_index:

            # 通过下标获取字段名
            col_names.append(head[int(i)])

        # 删除该字段
        df.drop(col_names, axis=1, inplace=True)

        # 保存文件
        df.to_csv(file_name, index=False)
    # 捕获异常
    except Exception as e:

        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})



@al.route('/ascending_order/<int:index>', methods=['post'])
def ascending_order(index):
    """
    升序排序
    :param index: 文件下标
    :return:
    """

    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 获取文件名
        file_name = 'temp_files/'+session.get('file_name')[index]

        # 字段下标
        c_index = list(map(lambda x: x[1:], list(cols)))

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

        # 字段名列表
        col_names = []

        # 遍历字段下标
        for i in c_index:
            # 获取字段名
            col_name = head[int(i)]

            # 添加进字段名列表
            col_names.append(col_name)

        # pandas读取文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 升序排序
        temp_data.sort_values(by=col_names, inplace=True, ascending=True)

        # 保存文件
        temp_data.to_csv(file_name, index=False)
    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/descending_order/<int:index>', methods=['post'])
def descending_order(index):
    """
    降序排序
    :param index: 文件下标
    :return:
    """
    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 字段下标
        c_index = list(map(lambda x: x[1:], list(cols)))

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

        # 字段名列表
        col_names = []
        # 遍历字段下标
        for i in c_index:
            # 获取字段名
            col_name = head[int(i)]

            # 添加进字段名列表
            col_names.append(col_name)

        # pandas读取文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 降序排序
        temp_data.sort_values(by=col_names, inplace=True, ascending=False)

        # 保存文件
        temp_data.to_csv(file_name, index=False)
    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/data_sum/<int:index>', methods=['post'])
def data_sum(index):
    """
    求和函数
    :param index: 文件下标
    :return:
    """
    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 新字段名
        new_col = data['new_col']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 字段下标
        c_index = list(map(lambda x: x[1:], list(cols)))

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

        # 字段名列表
        col_names = []

        # 遍历字段下标
        for i in c_index:
            # 获取字段名
            col_name = head[int(i)]

            # 添加进字段名列表
            col_names.append(col_name)

        # pandas读取文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 取出要求和的字段
        temp = temp_data[col_names]

        # 求和并将结果写进新的字段
        temp_data[new_col] = temp.sum(axis=1, numeric_only=True)

        # 保存文件
        temp_data.to_csv(file_name, index=False)
    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/data_count/<int:index>', methods=['post'])
def data_count(index):
    """
    计数函数
    :param index: 文件下标
    :return:
    """
    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

        # pandas读取文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 计数
        data = temp_data[head[int(cols[1:])]].value_counts(ascending=False).to_frame()

        # 更改名称
        data.index.name = "名字"
        data.columns = ['次数']

        # 表名 生成8个随机的小写英文字母作为表名加上时间戳
        t = str(int(time.time()))[:7]
        name = ''.join([chr(i) for i in np.random.randint(97, 123, 8)])

        # 保存为新的文件
        data.to_csv('temp_files/{}.{}'.format(name+t, 'csv'))

        # 将文件名写入session
        session['file_name'].append(name+t+'.csv')

        # 文件大小加1
        session['file_size'] += 1

    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})

@al.route('/group_agg/<int:index>', methods=['post'])
def group_agg(index):
    """
    分组聚合
    :param index: 文件下标
    :return:
    """
    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 获取分组的key
        group_key = data['group_key']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 字段下标
        c_index = list(map(lambda x: x[1:], list(cols)))

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

        # 字段名列表
        col_names = []

        # 遍历字段下标
        for i in c_index:
            # 获取字段名
            col_name = head[int(i)]

            # 添加进字段名列表
            col_names.append(col_name)

        # pandas读取文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 取出要分组的字段
        temp = temp_data[col_names]

        # 调用的函数
        fuc = ['size', 'count', 'max', 'min', 'median', 'mean', 'sum', 'std']

        # 分组
        data = temp.groupby(head[int(group_key[1:])])\
            .agg(fuc)

        # 表名 生成8个随机的小写英文字母作为表名加上时间戳
        t = str(int(time.time()))[:7]
        name = ''.join([chr(i) for i in np.random.randint(97, 123, 8)])

        # 保存为新的文件
        data.to_csv('temp_files/{}.{}'.format(name+t, 'csv'))
        # 打开文件并删除前三行 重写列
        with open('temp_files/{}.{}'.format(name+t, 'csv'), mode='r', encoding='utf-8', newline='\r\n') as file1:
            # 读取所有行
            lines = file1.readlines()

            # 重写文件 将列名重写
            with open('temp_files/{}.{}'.format(name + t, 'csv'), mode='w', encoding='utf-8', newline='\r\n') as file2:
                temp = '分组,'
                for col in col_names:
                    if col != head[int(group_key[1:])]:
                        temp_list = list(map(lambda x: col+'-'+x, fuc))
                        temp += ','.join(temp_list)
                        temp += ','
                temp = temp[:-1] + '\r\n'
                file2.write(temp)
                file2.writelines(lines[3:])

        # 将文件名写入session
        session['file_name'].append(name+t+'.csv')

        # 文件大小加1
        session['file_size'] += 1

    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/data_mean/<int:index>', methods=['post'])
def data_mean(index):
    """
    mean
    平均数函数
    :param file_index:
    :return:
    """
    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 新字段名
        new_col = data['new_col']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 字段下标
        c_index = list(map(lambda x: x[1:], list(cols)))

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

        # 字段名列表
        col_names = []

        # 遍历字段下标
        for i in c_index:
            # 获取字段名
            col_name = head[int(i)]

            # 添加进字段名列表
            col_names.append(col_name)
        # pandas读取文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 取出要求和的字段
        temp = temp_data[col_names]

        # 计数平均值
        temp_data[new_col] = temp.mean(axis=1)

        # 保存文件
        temp_data.to_csv(file_name, index=False)
    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/data_max/<int:index>', methods=['post'])
def data_max(index):
    """
    求max:最大值
    :param file_index:
    :return:
    """
    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 新字段名
        new_col = data['new_col']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 字段下标
        c_index = list(map(lambda x: x[1:], list(cols)))
        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

        # 字段名列表
        col_names = []

        # 遍历字段下标
        for i in c_index:
            # 获取字段名
            col_name = head[int(i)]

            # 添加进字段名列表
            col_names.append(col_name)
        # pandas读取文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 取出要求和的字段
        temp = temp_data[col_names]

        # 取最大值
        temp_data[new_col] = temp.max(axis=1)

        # 保存文件
        temp_data.to_csv(file_name, index=False)
    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/data_min/<int:index>', methods=['post'])
def data_min(index):
    """
    min
    求最小值
    :param file_index:
    :return:
    """
    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 新字段名
        new_col = data['new_col']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]
        # 字段下标
        c_index = list(map(lambda x: x[1:], list(cols)))

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

        # 字段名列表
        col_names = []

        # 遍历字段下标
        for i in c_index:
            # 获取字段名
            col_name = head[int(i)]

            # 添加进字段名列表
            col_names.append(col_name)

        # pandas读取文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 取出要求和的字段
        temp = temp_data[col_names]

        # 取最小值
        temp_data[new_col] = temp.min(axis=1)

        # 保存文件
        temp_data.to_csv(file_name, index=False)
    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/data_var/<int:index>', methods=['post'])
def data_var(index):
    """
    方差函数
    :param file_index:
    :return:
    """
    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 新字段名
        new_col = data['new_col']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 字段下标
        c_index = list(map(lambda x: x[1:], list(cols)))

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

        # 字段名列表
        col_names = []

        # 遍历字段下标
        for i in c_index:
            # 获取字段名
            col_name = head[int(i)]

            # 添加进字段名列表
            col_names.append(col_name)

        # pandas读取文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 取出要求和的字段
        temp = temp_data[col_names]

        # 求方差
        temp_data[new_col] = temp.var(axis=1)

        # 保存文件
        temp_data.to_csv(file_name, index=False)

    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/data_std/<int:index>', methods=['post'])
def data_std(index):
    """
    std
    标准差函数
    :param index:文件下标
    :return:
    """
    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 新字段名
        new_col = data['new_col']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 字段下标
        c_index = list(map(lambda x: x[1:], list(cols)))

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

        # 字段名列表
        col_names = []

        # 遍历字段下标
        for i in c_index:
            # 获取字段名
            col_name = head[int(i)]

            # 添加进字段名列表
            col_names.append(col_name)

        # pandas读取文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 取出要求和的字段
        temp = temp_data[col_names]

        # 求标准差
        temp_data[new_col] = temp.std(axis=1, numeric_only=True)

        # 保存文件
        temp_data.to_csv(file_name, index=False)
    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/col_split/<int:index>', methods=['POST'])
def col_split(index):
    '''
    列拆分
    :param index:
    :return:
    '''
    try:
        # 解析表单数据
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column_list']

        # 获取分割符号
        symbol_temp = data['symbol']
        if symbol_temp == 'tab':
            symbol = "\t"
        elif symbol_temp == 'semicolon':
            symbol = ";"
        elif symbol_temp == 'comma':
            symbol = ","
        elif symbol_temp == 'space':
            symbol = " "
        else:
            symbol = symbol_temp

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

            # 获取字段名
            col_name = head[int(cols)]

        # 用pandas打开文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 将列名用参数符号进行分割
        temp = str(col_name).split(symbol)

        # 判断列分割后长度是否大于1
        if len(temp) > 1:

            # 切割该字段
            temp_data[str(col_name).split(symbol)] = temp_data[col_name].str.split(symbol, 2, expand=True)

            # 保存文件
            temp_data.to_csv(file_name, index=False)

        else:
            # 保存文件
            temp_data.to_csv(file_name, index=False)

        # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/col_merge/<int:index>', methods=['POST'])
def col_merge(index):
    '''
        列合并
        :param index: 文件下标
        :return:
        '''
    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段列表
        cols = data['column_list']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 字段下标
        c_index = list(map(lambda x: x[1:], list(cols)))

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

        # 字段名列表
        col_names = []

        # 遍历字段下标
        for i in c_index:
            # 获取字段名
            col_name = head[int(i)]

            # 添加进字段名列表
            col_names.append(col_name)

        # pandas打开文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 转换为string类型
        temp_data = temp_data.applymap(str)

        # 合并数据
        temp_data["".join(col_names)] = temp_data[col_names].agg("".join, axis=1)
        # 保存文件
        temp_data.to_csv(file_name, index=False)
    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})


@al.route('/data_filter/<int:index>', methods=['POST'])
def data_filter(index):
    '''
        数据过滤
        :param index: 文件下标
        :return:
        '''
    try:
        # 获取字段
        data = json.loads(request.data.decode())

        # 获取字段下标
        cols = data['column']

        # 文件名
        table_name = data['table_name']

        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[index]

        # 读取文件
        with open(file=file_name, mode='r', encoding='utf-8') as file:

            head = file.readline()[:-1].split(',')

            # 获取字段名
            col_name = head[int(cols)]

        # 读取文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 条件
        choose = str(data['choose'])

        # 判断过滤选项
        # 大等于平均值
        if choose == 'above_avg':
            temp_data = temp_data[temp_data[col_name] >= temp_data[col_name].mean()]

        # 小等于平均值
        elif choose == 'below_avg':
            temp_data = temp_data[temp_data[col_name] <= temp_data[col_name].mean()]

        # 大等于中位数
        elif choose == 'above_median':
            temp_data = temp_data[temp_data[col_name] <= temp_data[col_name].median()]

        # 小等于中位数
        elif choose == 'below_median':
            temp_data = temp_data[temp_data[col_name] <= temp_data[col_name].median()]

        # 自定义过滤条件
        else:
            # 判断是否为多个条件
            if "and" in choose:
                # 去两边空格
                temp = list(map(lambda x: str(x).strip(), str(choose).split("and")))

            else:
                # 单个条件
                temp = [choose]

            # 符号替换
            replace_dict = {'[': '>=', '(': '>', ']': '>=', ')': '<'}

            # 存放式子
            formula = []

            # 单个条件
            if len(temp) == 1:

                # 拆分后的条件进行判断
                # 如果为范围表达式[25,50)
                if temp[0][0] in ["[", "]", "(", ")"]:
                    # 将表达式分为两个式子
                    formula.append([replace_dict.get(temp[0][0]), temp[0].split(',')[0][1:]])
                    formula.append([replace_dict.get(temp[0][-1]), temp[0].split(',')[1][:-1]])

                # 如果为普通表达式 含有this字符
                elif "this" in temp[0]:
                    formula.append([str(temp[0]).split(' ')[1], str(temp[0]).split(' ')[2]])

                # 如果为普通表达式 含有exist字符
                elif "exist" in temp[0]:

                    formula.append(['exist', str(temp[0]).split(' ')[1]])
            # 多个条件
            else:
                # 遍历所有条件
                for item in temp:
                    # 判断是否为区间表达式
                    if item[0] in ["[", "]", "(", ")"]:

                        # 将表达式解析后放入式子列表中
                        formula.append([replace_dict.get(item[0]), item.split(',')[0][1:]])
                        formula.append([replace_dict.get(item[-1]), item.split(',')[1][:-1]])

                    # 如果为普通表达式 含有this字符
                    elif "this" in temp[0]:

                        # 将表达式解析后放入式子列表中
                        formula.append([str(item).split(' ')[1], str(item).split(' ')[2]])

                    # 如果为普通表达式 含有exist字符
                    elif "exist" in temp[0]:

                        # 将表达式解析后放入式子列表中
                        formula.append(['exist', str(item).split(' ')[1]])

            # 遍历解析后的式子
            for item in formula:
                # 判断符号是否为">"
                if item[0] == '>':
                    # 判断是否为文字过滤
                    if '"' in item[1] or "'" in item[1]:
                        temp_data = temp_data[temp_data[col_name] > item[1][1: -1]]

                    # float类型过滤
                    elif '.' in item[1]:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] > float(item[1])]

                    # int类型过滤
                    else:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] > int(item[1])]

                # 判断符号是否为">"
                elif item[0] == '=':
                    # 判断是否为文字过滤
                    if '"' in item[1] or "'" in item[1]:
                        temp_data = temp_data[temp_data[col_name].astype(str) == item[1][1: -1]]
                    # float类型过滤
                    elif '.' in item[1]:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] == float(item[1])]

                    # int类型过滤
                    else:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] == int(item[1])]

                # 判断符号是否为"<"
                elif item[0] == '<':
                    # 判断是否为文字过滤
                    if '"' in item[1] or "'" in item[1]:
                        temp_data = temp_data[temp_data[col_name] < item[1][1: -1]]

                    # float类型过滤
                    elif '.' in item[1]:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] < float(item[1])]

                    # int类型过滤
                    else:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] < int(item[1])]

                # 判断符号是否为">="
                elif item[0] == '>=':
                    # 判断是否为文字过滤
                    if '"' in item[1] or "'" in item[1]:
                        temp_data = temp_data[temp_data[col_name] >= item[1][1: -1]]

                    # float类型过滤
                    elif '.' in item[1]:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] >= float(item[1])]

                    # int类型过滤
                    else:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] >= int(item[1])]

                # 判断符号是否为"<="
                elif item[0] == '<=':
                    # 判断是否为文字过滤
                    if '"' in item[1] or "'" in item[1]:
                        temp_data = temp_data[temp_data[col_name] <= item[1][1: -1]]

                    # float类型过滤
                    elif '.' in item[1]:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] <= float(item[1])]

                    # int类型过滤
                    else:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] <= int(item[1])]
                # 判断符号是否为"!="
                elif item[0] == '!=':
                    # 是否为关键字None
                    if item[1][1: -1] == "None" or item[1] == "None":
                        # 删除空值的行
                        temp_data = temp_data.dropna()

                    # 判断是否为文字过滤
                    elif '"' in item[1] or "'" in item[1]:
                        temp_data = temp_data[temp_data[col_name] != item[1][1: -1]]

                    # float类型过滤
                    elif '.' in item[1]:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] != float(item[1])]

                    # int类型过滤
                    else:
                        # 条件过滤
                        temp_data = temp_data[temp_data[col_name] != int(item[1])]

                # 判断符号是否为"exist"
                elif item[0] == 'exist':
                    # 条件过滤
                    temp_data = temp_data[temp_data[col_name].str.contains(item[1][1: -1])]

        # 表名 生成8个随机的小写英文字母作为表名加上时间戳
        t = str(int(time.time()))[:7]
        name = ''.join([chr(i) for i in np.random.randint(97, 123, 8)])

        # 保存为新的文件
        temp_data.to_csv('temp_files/{}.{}'.format(name + t, 'csv'), index=0)

        # 将文件名写入session
        session['file_name'].append(name + t + '.csv')

        # 文件大小加1
        session['file_size'] += 1

        # 过滤的文件名
        session['filter_name'] = table_name
    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)
        session['is_filter'] = "false"
        # 返回状态
        return jsonify({'status': 'fail'})

    else:
        session['is_filter'] = "true"
        # 返回状态
        return jsonify({'status': 'success'})

@al.route('/row_del/<string:index>')
def row_del(index):
    '''
    删除行
    :param index:行索引
    :return:
    '''

    try:
        if index[0] != "-":

            row_index = int(index.split('-')[0])

            file_index = int(index.split('-')[1])
        else:

            row_index = int(index.split('-')[2])

            file_index = int(index.split('-')[3])
        # 获取文件名
        file_name = 'temp_files/' + session.get('file_name')[file_index]

        # 用pandas打开文件
        temp_data = pd.read_csv(file_name, delimiter=',')

        # 保存临时文件
        temp_data.to_csv(session.get('temp_file'), index=False)

        # 记录回滚文件
        session['rollback_file'] = file_name

        # 删除行
        temp_data = temp_data.drop(labels=(row_index))

        # 保存文件
        temp_data.to_csv(file_name, index=False)

    # 捕获异常
    except Exception as e:
        print(e)
        # 记录错误信息
        logging.info(e)

        # 返回状态
        return jsonify({'status': 'fail'})

    else:

        # 返回状态
        return jsonify({'status': 'success'})